﻿// Shader是关键字,Shader中有多个SubShader,只会执行一个,一般按复杂度从上相下排序,
//SubShader中,可以有多个Pass,每个Pass都会执行,每个Pass都将模型渲染一遍.
Shader "Custom/1_Texture" {
	/*
	定义 一堆属性,从unity的inspector中进行编辑,unity会将同名的属性,传递到shadaer中.
	格式, shader内变量名("inspector中显示的文字",unity的类型) = 默认值.
	unity类型有 : 2D,Cube,Rect,Color,Float,Range,Vector
	*/
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_Color("Tint Color",Color) = (1,1,1,1)
	}
	//定义CGINCLUDE块,可以将代码放在此块,CGProgram块中使用.
	CGINCLUDE
		#include "UnityCG.cginc" //引入Unity提供的cginc文件,方便获取渲染引擎的数据,及使用unity提供的工具方法.此文件的路径:Unity\Editor\Data\CGIncludes
		sampler2D _MainTex;//接收UNITY传入的_MainTex
		float4 _Color;//接收unity传入的_Color	
		
		//定义,vertex传递给fragment的数据,v2f:vertex to fragment
		struct v2f{
			float4 pos:POSITION; //存放变换并投影的顶点坐标
			float2 uv:TEXCOORD; //顶点的纹理坐标.fragment中用此坐标取对应顶点在贴图上的像素.
		};
		
		/*定义 顶点着色器方法.此方法必须完成目标输出变换后的顶点.
			1 最常见的是 将顶点变换到屏幕坐标.
			2 还可以直接将 原始(本地)顶点坐标输出.
			
			此方法执行完毕后,渲染流程继续执行,之后顶点就处于屏幕上了.
		*/
		v2f vert(appdata_base i){
			v2f o; //声明v2f 结构体.
			o.pos = mul(UNITY_MATRIX_MVP,i.vertex); //将顶点依次变换到世界空间,视野空间,投影空间.mul方法执行完毕,
			o.uv = i.texcoord; //直接输出 模型上指定的纹理坐标.
			return o; //输出 o.
		}
		/*
			定义 片段着色器,此方法必须输出一个像素的颜色,而且必须指定COLOR语义.
			此方法执行完毕后,渲染流程继续执行,对颜色进行Fog,之后测试,有AlphaTest,StencilTest,DepthTest,
			之后对新生成的像素与缓冲区已存在的像素进行Blend.
			完毕后,新生成的像素存放帧缓冲区,
			最后,刷新屏幕显示.
		*/
		float4 frag(v2f i):COLOR{
			float4 texColor = tex2D(_MainTex,i.uv); //调用tex2D,使用顶点着色器中传递来的uv,从_MainTex获取像素.
			texColor *= _Color; //将 获取到的纹理像素与_Color颜色进行乘法调和.
			return texColor; //输出此颜色.存放到帧缓冲区
		}
		
	ENDCG
	
	//定义 一个SubShader
	SubShader {
		//定义 让unity渲染引擎参考的渲染或性能项.
		Tags { "RenderType"="Opaque" }
		//定义 各种图形硬件的渲染状态,如开关状态,设置不同的值等.
		//定义在 Pass的外面,会成为所有Pass的默认值.
		LOD 200
		Blend One One
		
		//定义 一个Pass,对模型的所有三角形执行一遍渲染.
		Pass{
			//这里可以定义Pass特定的渲染状态.
			Blend SrcAlpha OneMinusSrcAlpha
			
			//定义 CGPROGRAM块,此块内是cg代码.cg区分大小写.
			CGPROGRAM
			#pragma vertex vert //确定 顶点着色器使用的方法
			#pragma fragment frag //确定 片段着色器使用的方案.
			
			ENDCG
		}
	}
	//unity 手册上说,如果所有的shader都没执行,就执行Diffuse.
	//实际上,加入此句,会有shadowCaster的作用,就是说会产生阴影.
	FallBack "Diffuse"
}
